package org.example.three;

import com.rabbitmq.client.AMQP;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.MessageProperties;
import org.example.utils.RabbitMqUtil;

import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.util.Scanner;
import java.util.concurrent.TimeoutException;

/**
 * 消息在手动应答时不丢失,返回队列中重新消费
 */
public class Task1 {
    public static final String QUEUE_NAME = "ack_queue";

    public static void main(String[] args) throws IOException, TimeoutException {
        Channel channel = RabbitMqUtil.getChannel();
        /**
         * 开启发布确认,队列和消息都持久化还不能保证真正的持久化,消息可能还没持久化mq就宕机了,所以当消息持久化保存到磁盘
         * 后,向生产者发布一个确认消息,表示已经持久化完成
         */
        channel.confirmSelect();
        /**
         * 生成一个队列
         * 1.队列名称
         * 2.队列里的消息是否持久化(磁盘) 默认不持久化(内存)
         * 3.该队列是否能供多个消费者消费,进行消息共享, true:可以供多个消费者消费,false:只能一个消费者消费
         * 4.是否进行自动删除 最后一个消费者断开连接后,该队列是否自动删除,true:自动删除,false:不自动删除
         * 5.其它参数
         */
        //持久化 , 如果不持久化,rabbitmq宕机,队列会丢失
        boolean durable = true;
        channel.queueDeclare(QUEUE_NAME,durable,false,false,null);
        Scanner scanner = new Scanner(System.in);
        while(scanner.hasNext()){
            String message = scanner.next();
            /**
             * 设置生产者发送消息为持久化消息,注意:将消息标记为持久化并不能完全保证不会丢失消息.尽管它高速rabbitMq将消息保存到磁盘
             * 但是这里依然存在当消息刚准备存储在磁盘的时候,但是还没有存储完,消息还在缓存的一个间隔点.此时并没有真正写入磁盘.持久性
             * 保证并不强,但是对于我们的简单任务队列而言,这已经绰绰有余了.
             */
            AMQP.BasicProperties basicProperties = MessageProperties.PERSISTENT_TEXT_PLAIN;
            channel.basicPublish("",QUEUE_NAME,basicProperties,message.getBytes(StandardCharsets.UTF_8));
            System.out.println("消息发送成功: " + message);
        }
    }
}
